#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<ctype.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/types.h>
int main(void)
{
    int lfd;//服务端创建socket用于 listen监听

    struct sockaddr_in serv_addr;
   // serv_addr.sin_addr

    //创建套接字
    lfd=socket(AF_INET,SOCK_STREAM,0);
    
    //初始化套接字的地址结构，主要是port和地址
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(9527);//将本地端口转换成网络字节序的port
    serv_addr.sin_addr.s_addr=htons(INADDR_ANY);//将本地IP地址（系统自动分配的地址），转换成网络字节序的地址

    bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));//将创建服务端的套接字和网络端的IP+port进行绑定
       

    
    listen(lfd,128);//设置监听，监听服务器上同时能访问的客户端数目，上限是128
     struct sockaddr_in clit_addr;
    
     socklen_t clit_len;
    int cfd=accept(lfd,(struct sockaddr*)&clit_addr,&clit_len);
 //1：阻塞等待客户端上向服务器进行任务请求
//2：若accept成功，则返回cliet的套接字对应的文件描述符
//3：且通过clit_addr穿出客户端的套接字结构（IP+port）
    if(cfd==-1)
    {
        perror("accept fail!\n");
    }

    //模拟服务器进行数据大小转小写操作
    int ret;
    char buf[1024];

    while(1)
    {
        
    ret=read(cfd,buf,sizeof(buf));
    
    write(STDOUT_FILENO,buf,ret);
    for(int i =0;i<ret;i++)
    {

        buf[i]=toupper(buf[i]);

    }

    write(cfd,buf,ret);

    }

    close(cfd);
    close(lfd);




    return 0;
}
